perm filename FTPS.C[11,HE] blob sn#688213 filedate 1982-12-06 generic text, type T, neo UTF8
/*
 * eftpsend.c
 *
 * Simple eftp sender program; not as flexable as "eftp", but
 * does Pup internet routing right.
 *
 * Jeffrey Mogul		6 November 1981		Stanford University
 *
 * Synopsis:
 *	eftpsend hostname filename [key]
 *
 *	key is initial letter(s) of: debug, unswap
 *		(n.b.: "unswap" is wrt local byte order; the default
 *		 on Vax-to-dover transfers is "swap")
 *
 *	This program is roughly equivalent to
 *	"eftp reqs" <hostname> <filename>
 */
#include <stdio.h>
#include <eftp.h>
#include <pupstatus.h>
#include <pupconstants.h>

#define	BUFFERSIZE 512
#define	CHAN_TIMEOUT	30	/* seconds */

#define	DEBUG	if (debug) printf

char buf[BUFFERSIZE];

/* flags */
int debug = 0;
int unswap = 0;

main(argc,argv)
int argc;
char **argv;
{	/* */
	struct EftpChan ec;
	struct Port remport;
	int i;
	int stat;
	int done = 0;
	int tsize;
	int rsize;
	int fileid;
	long tstart;

	if ((argc > 4) || (argc < 3)) {
	    fprintf(stderr,"Usage: eftpsend hostname filename [du]\n");
	    exit(1);
	}

	if (argc == 4) {	/* key to be parsed */
	    char *kp = argv[3];
	    
	    while (*kp) {
	    	switch (*kp) {
		
		case 'd': debug++;
			  break;

		case 'u': unswap++;
			  break;
		
		default: fprintf(stderr,"Unknown key: %c\n",*kp);
			 exit(1);
		}
		kp++;
	    }
	}


	if ((fileid = open(argv[2],0)) == -1) {
	    perror("eftpsend");
	    fprintf(stderr,"[open failed on %s]\n",argv[2]);
	    exit(1);
	}

ReLookup:
	switch (mlookup(argv[1],&remport)) {
	
		case OK:
			DEBUG("Host:%s is ",argv[1]);
			if (debug) {
			    PortPrint(&remport);
			    printf("\n");
			}
			break;
		
		case NOTFOUND:
			fprintf(stderr,"[Host %s name not found]\n",argv[1]);
			exit(1);

		case NOCHAN:
			DEBUG("Waiting for free network channel\n");
			sleep(30);
			goto ReLookup;
				
		case TIMEOUT:
			fprintf(stderr,"[Name server did not respond]\n");
			exit(1);

		default:
			fprintf(stderr,
				"[eftpsend: internal error in lookup]\n");
			exit(1);
	}

	/* get first bufferfull */
	rsize = read(fileid,buf, sizeof buf);
	DEBUG("Read size = %d\n",rsize);
	if (rsize == 0) {
	    fprintf(stderr,"[File %s is empty]\n",argv[2]);
	    exit(0);
	}

Restart:
	/* EfSendOpen(Efchan, Dest, timeout, bswap?) */
#ifdef	PUP__NNSO
	switch(EfSendOpen(&ec, &remport, CHAN_TIMEOUT, unswap)) {
#else
	switch(EfSendOpen(&ec, &remport, CHAN_TIMEOUT, !unswap)) {
#endif	
		case OK:
			DEBUG("Open OK\n");
			break;

		case NOCHAN:
			DEBUG("Waiting for free network channel\n");
			sleep(30);
			goto Restart;
		
		case NOROUTE:
			fprintf(stderr,"[Cannot get to %s from here]\n",
					argv[1]);
			exit(1);
	}
	
	tstart = time(0);
	tsize = 0;

	while (!done) {
		switch(stat = EftpWrite(&ec,buf,rsize)) {

		case OK:
			tsize += rsize;	/* add in OLD rsize */
			if ((rsize = read(fileid, buf, sizeof buf)) == 0)
			   done++;	/* done if EOF */
			DEBUG("sent OK; next read size is %d\n",rsize);
			break;

		case TIMEOUT:
			fprintf(stderr,"[send timed out]\n");
			EfSendEnd(&ec);	/* maybe server still listening */
			exit(1);
		
		case EFTP_ABORT:
			fprintf(stderr,"[Abort code %o: %s]\n",
				EftpAbortCode,EftpErrMsg);
			exit(1);

		case EFTP_WAIT:
			switch (EftpAbortCode) {
			
			case EFTPA_LONGWAIT:
				DEBUG("waiting %d seconds\n",EFTPW_LWAIT);
				sleep(EFTPW_LWAIT);
				break;

			case EFTPA_MEDWAIT:
				DEBUG("waiting %d seconds\n",EFTPW_MWAIT);
				sleep(EFTPW_MWAIT);
				break;

			case EFTPA_RECBUSY:
				DEBUG("waiting %d seconds\n",EFTPW_RBUSY);
				sleep(EFTPW_RBUSY);
				break;

			default:
				fprintf(stderr,"[eftpsend: internal error, ");
				fprintf(stderr,"inconsistent abort code:\n");
				fprintf(stderr,"status = %o\n",stat);
				fprintf(stderr,"abort code = %o :%s :%s]\n",
					EftpAbortCode,EftpErrMsg,PupErrMsg);
				exit(1);
			}
			goto Restart;
		
		case EFTP_ERROR:
			fprintf(stderr,"[eftpsend: EFTP protocol error]\n");
			exit(1);
		
		case EFTP_RESTART:
			DEBUG("eftp restart\n");
			goto Restart;

		default:
			fprintf(stderr,"[eftpsend: internal error,");
			fprintf(stderr,"status = %o\n",stat);
			fprintf(stderr,"abort code = %o :%s :%s]\n",
				EftpAbortCode,EftpErrMsg,PupErrMsg);
			exit(1);
		}
	}

	EfSendEnd(&ec);	/* end the transfer */
	EfSendClose(&ec);

	tstart -= time(0);
	DEBUG("time = %d, rate = %d\n",-tstart,-(tsize*8)/tstart);

	exit(0);
}